// 
//  Copyright 2011  reda
// 
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
// 
//        http://www.apache.org/licenses/LICENSE-2.0
// 
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.
using System;
using System.Reflection;
using ManiacMusicManager.Data.Core;
using ManiacMusicManager.Data.DAO;
using ManiacMusicManager.Data.DAO.Ifaces;
using ManiacMusicManager.Data.DAO.Wrapper;
namespace ManiacMusicManager.Data
{
	public partial class SessionManager : IDisposable
	{
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type <typeparamref name="T"/>
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IDAO<T> NewDAO<T>()
			where T : Entity
		{
			var t = typeof(T);

			MethodInfo newMethod = this.GetType().GetMethod(string.Format("New{0}DAO", t.Name), new Type[] {});
			
			if(newMethod == null)
				throw new NotSupportedException("Il n'existe pas de DAO pour le type " + t.Name);
			else
				return newMethod.Invoke(this, new object[] {}) as IDAO<T>;
		}
		
		public IDAO<Entity> NewDAO(Type t) {
			if (t == null)
				throw new ArgumentNullException ("t");
			
			MethodInfo newMethod = this.GetType().GetMethod(string.Format("New{0}DAO", t.Name), new Type[] {});
			
			if(newMethod == null)
				throw new NotSupportedException("Il n'existe pas de DAO pour le type " + t.Name);
			else {
				var dao = newMethod.Invoke(this, new object[] {}) as IDAO;
				return dao.Wrap();
			}
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Album
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IAlbumDAO NewAlbumDAO() {
			return new AlbumDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Artiste
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IArtisteDAO NewArtisteDAO() {
			return new ArtisteDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Chanson
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IChansonDAO NewChansonDAO() {
			return new ChansonDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Compilation
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public ICompilationDAO NewCompilationDAO() {
			return new CompilationDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Genre
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IGenreDAO NewGenreDAO() {
			return new GenreDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type Langage
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public ILangageDAO NewLangageDAO() {
			return new LangageDAO(this.Session);
		}
		
		/// <summary>
		/// Crée une nouvelle instance DAO pour le type MusicFile
		/// </summary>
		/// <returns>
		/// Nouveau DAO créé
		/// </returns>
		public IMusicFileDAO NewMusicFileDAO() {
			return new MusicFileDAO(this.Session);
		}
	}
}

